#include <iostream>
#include <unistd.h>
#include <signal.h>
#include <sys/wait.h>

void PrintBlock(sigset_t oldset)
{
    std::cout << "cur block:";

    for (int i = 31; i > 0; i--)
    {
        if (sigismember(&oldset, i))
            std::cout << 1;
        else
            std::cout << 0;
    }
    std::cout << std::endl;
}

void PrintPending()
{
    sigset_t pending;
    sigpending(&pending);

    std::cout << "cur pending:";
    for (int i = 31; i > 0; i--)
    {
        if (sigismember(&pending, i) == 1)
            std::cout << 1;
        else
            std::cout << 0;
    }
    std::cout << std::endl;
}


// void handler(int signo)
// {
//     std::cout << "get a signo:" << signo << std::endl;
//     int count = 10;
//     while (count--)
//     {
//         sigprocmask(SIG_BLOCK, &set, &oldset);

//         // PrintPending();
//         PrintBlock(oldset);
//         sleep(1);
//     }
// }

int main()
{
    sigset_t set, oldset;
    sigemptyset(&set);
    sigemptyset(&oldset);
    // signal(5, handler);
    // 分别阻塞2号与40号信号
    sigaddset(&set, 2);
    sigaddset(&set, 40);
    while (true)
    {
        sigprocmask(SIG_BLOCK, &set, &oldset);
        PrintBlock(oldset);
        // PrintPending();
        sleep(1);
    }

    return 0;
}

// void sigcb(int signo)
// {
//     std::cout <<"get a signol:" << signo << std::endl;
// }

// int main()
// {
//     // signal(2,sigcb);
//     struct sigaction act,oact;
//     act.sa_handler = sigcb;
//     sigaddset(&act.sa_mask,4);
//     sigaddset(&act.sa_mask,5);
//     sigaddset(&act.sa_mask,6);
//     sigaddset(&act.sa_mask,7);

//     sigaction(2,&act,&oact);
//     int n = 10;
//     while(n--)
//     {
//         pause();
//     }
//     return 0;
// }

// void PrintBlock()
// {
//     sigset_t set, oset;
//     sigemptyset(&set);
//     sigemptyset(&oset);
//     sigprocmask(SIG_BLOCK, &set, &oset);

//     std::cout << "cur block:";
//     for (int i = 31; i > 0; i--)
//     {
//         if (sigismember(&oset, i) == 1)
//             std::cout << 1;
//         else
//             std::cout << 0;
//     }
//     std::cout << std::endl;
// }

// int main()
// {
//     struct sigaction act, oldact;
//     act.sa_handler = handler;
//     // sigaddset(&act.sa_mask,3);
//     // sigaddset(&act.sa_mask,4);
//     // sigaddset(&act.sa_mask,5);
//     // sigaddset(&act.sa_mask,6);
//     ::sigaction(2, &act, &oldact); // 设置捕捉方法
//     while (true)
//     {
//         // PrintBlock();
//         PrintPending();
//         pause();
//     }
//     return 0;
// }

// void PrintPending(sigset_t pending)
// {
//     std::cout << "cur pending list [" << getpid() << "]:";
//     for (int i = 31; i > 0; i--)
//     {
//         if (sigismember(&pending, i) == 1)
//             std::cout << 1;
//         else
//             std::cout << 0;
//     }
//     std::cout << std::endl;
// }

// int main()
// {
//     // 1.屏蔽2号信号
//     sigset_t set, oldset;
//     sigemptyset(&set); // 使用前先初始化一下
//     sigemptyset(&oldset);
//     sigaddset(&set, 2); // 设置2号信号
//     sigprocmask(SIG_SETMASK, &set, &oldset); // 将信号添加至进程中
//     while (true)
//     {
//         // 2. 获取pending表
//         sigset_t pending;
//         sigpending(&pending); // 调用函数获取进程的pending表

//         PrintPending(pending);
//         sleep(1);
//     }
//     return 0;
// }

// void handle(int signo)
// {
//     std::cout << "get a signo:" << signo << std::endl;
// }

// int main()
// {
//     sigset_t s;
//     signal(2,SIG_IGN); //忽略，本身就是一种信号捕捉的方法，动作是忽略
//     signal(2,SIG_DFL); //默认
//     while(true)
//     {
//         pause();
//     }
//     // signal(SIGSEGV,handle);//捕捉信号
//     // int* p = nullptr;
//     // *p = 100;
//     // if (fork() == 0)
//     // {
//     //     int a = 10;
//     //     a /= 0;
//     // }
//     // int status = 0;
//     // int rid = waitpid(-1, &status, 0);

//     // printf("exit signal:%d, core dump:%d\n", status & 0x7f, (status >> 7) & 1);

//     // while (true)
//     //     ;

//     return 0;
// }

// int main()
// {
//     alarm(5);
//     while (true)
//     {
//         std::cout << "hello world" << std::endl;
//         sleep(1);

//     }
//     return 0;
// }

// void UseMethod()
// {
//     std::cout << "Use method: kill signal_number pid" << std::endl;
// }

// int main(int argc, char *argv[])
// {
//     if (argc != 3)
//     {
//         UseMethod();
//         return -1;
//     }

//     int sig = atoi(argv[1]);
//     int pid = atoi(argv[2]);

//     kill(pid, sig);

//     return 0;
// }

// for (int i = 1; i <= 31; i++)
// {
//     signal(i, handle);
// }

// void handle(int sig)
// {
//     std::cout << "捕捉" << sig << "号信号" << std::endl;
// }

// int main()
// {
//     int count = 6;
//     while (true)
//     {
//         std::cout << "hello world" << std::endl;
//         sleep(1);
//         count--;
//         if (count == 0)
//             abort();
//     }
//     return 0;
// }